#pragma once
#include "api.h"
#include "game.h"
#include "lua-utils.h"

struct LuaApi {
  // --- action ---
  int take_taxi(LuaPtr lptr);
  int destroy(LuaPtr lptr);
  int sell(LuaPtr lptr);
  int equip(LuaPtr lptr);
  int send_mail(LuaPtr lptr);
  int loot(LuaPtr lptr);
  int select(LuaPtr lptr);
  int click(LuaPtr lptr);
  int macro(LuaPtr lptr);
  int go(LuaPtr lptr);

  // --- ground ---
  int grounds(LuaPtr lptr);

  // --- item ---
  int get_container_item(LuaPtr lptr);
  int get_container_item_by_id(LuaPtr lptr);
  int get_num_free_slots(LuaPtr lptr);
  int get_container_num_slots(LuaPtr lptr);

  // -- unit ---
  int get_spell_cooldown(LuaPtr lptr);
  int spells(LuaPtr lptr);
  int get_buff(LuaPtr lptr);
  int unit_get_buff(LuaPtr lptr);
  int get_unit_by_id(LuaPtr lptr);
  int units(LuaPtr lptr);
  int player(LuaPtr lptr);

  // --- basic ---
  int get_time(LuaPtr lptr);
  int get_game_time(LuaPtr lptr);
  int key_down(LuaPtr lptr);
  int key_up(LuaPtr lptr);
  int sleep(LuaPtr lptr);
  int printf(LuaPtr lptr);
  int print(LuaPtr lptr);

  // --- Constructors ---
  LuaApi(std::shared_ptr<Game> game, std::shared_ptr<Api> api);
  LuaApi() = delete;
  LuaApi(LuaApi &&) = default;
  LuaApi(const LuaApi &) = default;
  LuaApi &operator=(LuaApi &&) = default;
  LuaApi &operator=(const LuaApi &) = default;
  ~LuaApi();

private:
  std::shared_ptr<Game> game_;
  std::shared_ptr<Api> api_;
};
